上回我們在PowerShell中使用了多條命令列來幫助我們從SSMS中獲取資料來源物件,這樣做的目的在於我們執行的過程中,我們不需要真的去手動輸入物件的內容,只需要配合工作需求調整我們腳本中命令列的項目,現在我們就嘗試將前幾回的內容合併起來,檢視整個流程是否符合預期,而工作需求比照上回的內容:把A資料庫中所有資料表以及資料內容遷移至B資料庫中。
首先我們先將待會需要的變數先建立起來,如下:
$SERVER = '.'
$SOURCE_DATABASE = 'FirstDataBase'
$TARGET_DATABASE = 'SecondDataBase'
$PATH = "C:\temp"
接著在上回我們已經使用了命令列成功將資料來源從SSMS取出,語法如下:
#從SSMS將查詢結果匯出,並消除表頭和下方文字
sqlcmd -S . -d FirstDataBase -Q "SET NOCOUNT on;SELECT TABLE_NAME + '' FROM INFORMATION_SCHEMA.TABLES" -o C:\temp\TableName.txt
#以轉換成另一個檔案,將檔案雜訊移除
findstr /R /C:"^[^-]*$" C:\temp\TableName.txt > C:\temp\TableNameList.txt
#移除不需要的檔案
Remove-Item C:\temp\TableName.txt
#將檔案存取成變數
$TableNameList = Get-Content C:\temp\TableNameList.txt
#產出目標資料庫
sqlcmd -S '.' -Q "CREATE DATABASE $TARGET_DATABASE"
接著我們使用迴圈批次產生及匯入.sql腳本,語法接續如下:
#批次產生.sql腳本
FOR($i=1;$i -lt $TableNameList.Count;$i++)
{
#將物件去除字串中空白後存成變數
$FILENAME = $TableNameList[$i] -replace "^\s+|\s+$",""
#將物件內容匯出成.sql腳本
mssql-scripter -S . -d $SOURCE_DATABASE --schema-and-data --include-objects $FILENAME --exclude-use-database --display-progress -f $PATH\$FILENAME.sql
#將產生的.sql腳本寫入目標資料庫
sqlcmd -S '.' -d $TARGET_DATABASE -i $PATH\$FILENAME.sql
}
成功執行後即能在目標資料庫中產生相同的資料表以及資料內容,當然我們也能依照情境作調整,在我的工作內容中會有很多票券冊資料以Table的結構型式存放在資料庫中,這些資料有時多達上百張,並且Table的名稱不是固定的,因此在此種情境下,我就能使用上述的腳本進行作業,當然腳本也能依照許多情境去做改寫。
更多小知識,我們下次見~~